package com.test.springcloud.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * 自定义zuul网关过滤器
 *
 * @create: 2019-07-08 21:59
 **/
@Component
public class LoginFilter extends ZuulFilter {
    /**
     * 过滤器的类型：pre(路由前) route(路由时) post(路由后) error(路由异常)
     *
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 执行顺序，返回值越小优先级越高
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return 10;
    }

    /**
     * 是否执行run方法
     * true：执行run方法
     * false：不执行
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 编写过滤器的业务逻辑
     * 这里模拟一个请求，如果里面有token参数则表示已经登录
     *
     * @return
     */
    @Override
    public Object run() {
        //初始化centext上下文对象(zuul网关的上下文)
        RequestContext requestContext = RequestContext.getCurrentContext();

        //获取request对象
        HttpServletRequest request = requestContext.getRequest();

        //获取参数
        String token = request.getParameter("token");
        if (StringUtils.isEmpty(token)) {
            //拦截，不转发请求
            requestContext.setSendZuulResponse(false);
            //作一个提示，401身份未认证
            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
            //设置响应体
            requestContext.setResponseBody("request error");
        }

        //null代表该过滤器什么也不做
        return null;
    }
}
